package TreeMap;
/*面试题：如果hashcode一样，equals一定一样码？  --》不一定一样
*        如果equals一样，hashcode一定一样码？  --》一定一样
*        hashcode一样只能说明在数组中的同一个下标，但是一个下标中是一个链表，
*        链表中有很多值所以不一定一样，
*        但是equals一样说明两个值是一样的，所以hashcode一定是一样的
* */
//实现一个泛型（引用类型）的hash
public class HashBuck2<K,V> {
    static class Node<K,V> {
        public K key;
        public V value;
        public Node<K,V> next;

        //构造
        public Node(K key,V value) {
            this.key = key;
            this.value = value;
        }
    }
    public Node<K,V>[] array = (Node<K,V>[])new Node[10];
    public int useSize;
    public static final double LOAD_FCTOR = 0.75;

    public void put(K key,V value) {
        int hash = key.hashCode();
        int index = hash % array.length;
        Node<K,V> cur = array[index];
        while (cur != null) {
            if (cur.key.equals(key)) {
                cur.value = value;
                return;
            }
            cur = cur.next;
        }
        //该用头插法进行插入了
        Node<K,V> node = new Node<>(key,value);
        node.next = array[index];
        array[index] = node;
        useSize++;
        //满足负载因子吗？.....
    }

    public V get(K key) {
        int hash = key.hashCode();
        int index = hash % array.length;
        Node<K,V> cur = array[index];
        //从数组下标的每个头节点开始遍历
        while (cur != null) {
            if (cur.key.equals(key)) {
                return  cur.value;//返回的是value是V类型。
            }
            cur = cur.next;
        }
        return null;
    }
}
